home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / slip / sl.shar / sl / src / local / dstaddr.c next >
C/C++ Source or Header  |  1988-04-12  |  1KB  |  72 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <sys/ioctl.h>
  4.  
  5. #include <net/if.h>
  6. #include <netinet/in.h>
  7.  
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include <netdb.h>
  11.  
  12. struct    ifreq ifr;
  13. int    s;
  14.  
  15. main(argc, argv)
  16.     int argc;
  17.     char *argv[];
  18. {
  19.     char *strncpy();
  20.  
  21.     if (argc < 3) {
  22.         (void) fprintf(stderr, "usage: %s interface dest_addr\n", argv[0]);
  23.         exit(1);
  24.     }
  25.     (void) strncpy(ifr.ifr_name, argv[1], strlen(argv[1]) + 1);
  26.     s = socket(AF_INET, SOCK_DGRAM, 0);
  27.     if (s < 0) {
  28.         perror("socket");
  29.         exit(1);
  30.     }
  31.     if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
  32.         perror("ioctl (SIOCGIFFLAGS)");
  33.         exit(1);
  34.     }
  35.     in_getaddr(argv[2], &ifr.ifr_addr);
  36.     if (ioctl(s, SIOCSIFDSTADDR, (caddr_t)&ifr) < 0)
  37.         perror("ioctl (SIOCSIFDSTADDR)");
  38. }
  39.  
  40. struct    in_addr inet_makeaddr();
  41.  
  42. in_getaddr(s, saddr)
  43.     char *s;
  44.     struct sockaddr *saddr;
  45. {
  46.     register struct sockaddr_in *sin = (struct sockaddr_in *)saddr;
  47.     struct hostent *hp;
  48.     struct netent *np;
  49.     int val;
  50.  
  51.     sin->sin_family = AF_INET;
  52.     val = inet_addr(s);
  53.     if (val != -1) {
  54.         sin->sin_addr.s_addr = val;
  55.         return;
  56.     }
  57.     hp = gethostbyname(s);
  58.     if (hp) {
  59.         sin->sin_family = hp->h_addrtype;
  60.         bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
  61.         return;
  62.     }
  63.     np = getnetbyname(s);
  64.     if (np) {
  65.         sin->sin_family = np->n_addrtype;
  66.         sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
  67.         return;
  68.     }
  69.     (void) fprintf(stderr, "%s: bad value\n", s);
  70.     exit(1);
  71. }
  72.